package co.edu.udistrital;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;

import javax.swing.JPanel;

/**
 * Esta clase es responsable de mostrar informacion del juego
 * como la siguiente figura, el puntaje y el nivel actual 
 */
public class PanelGeneral extends JPanel {
	
	/**
	 * Serial Version UID.
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Las dimensiones en pixeles de cada cuadro para la siguiente figura.
	 */
	private static final int TAMANIO_CUADRO = Tablero.TAMANIO_CUADRO ;
	
	/**
	 * El ancho de las sombras en cada cuadro de la siguiente figura.
	 */
	private static final int SOMBRA_CUADRO = Tablero.SOMBRA_CUADRO ;
	
	/**
	 * Posicion en x de la siguiente figura
	 */
	private static final int SIGUIENTE_FIGURA_X = 100;
	
	/**
	 * Posicion en y de la siguiente figura
	 */
	private static final int SIGUIENTE_FIGURA_Y = 65;
	
	/**
	 * Fuente usada para el nivel y la puntuacion
	 */
	private static final Font FUENTE = new Font("Arial", Font.ITALIC, 15);
	
	/**
	 * El color del texto
	 */
	private static final Color COLOR_TEXTO = new Color(128, 192, 128);
	
	/**
	 * La instancia de tetris
	 */
	private Tetris tetris;
	
	/**
	 * Constructor del panel general
	 */
	public PanelGeneral(Tetris tetris) {
		this.tetris = tetris;
		
		setPreferredSize(new Dimension(200, Tablero.ALTO_PANEL));
		setBackground(Color.BLACK);
	}
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		
		g.setColor(COLOR_TEXTO);
		
		/*
		 * Variable que servira de cursor para saber en que posicion se pintara
		 */
		int cursor;
		
		/*
		 * Se dibuja el texto
		 */
		g.setFont(FUENTE);
		g.drawString("Nivel: " + tetris.getNivel(), 40, cursor = 175);
		g.drawString("Puntaje: " + tetris.getPuntos(), 40, cursor += 25);
		
		/*
		 * Se dibuja la siguiente figura a aparecer en el tablero.
		 */
		Figura figura = tetris.getSiguienteFigura();
		if(!tetris.esJuegoPerdido() && figura != null) {
			/*
			 * Se obtienen las propiedades de la figura actual.
			 */
			int columnas = figura.getColumnas();
			int filas = figura.getFilas();
			int dimension = figura.getDimension();
		
			/*
			 * Calcular la esquina superior izquierda ( origen ) de la pieza .
			 */
			int startX = (SIGUIENTE_FIGURA_X - (columnas * TAMANIO_CUADRO / 2));
			int startY = (SIGUIENTE_FIGURA_Y - (filas * TAMANIO_CUADRO / 2));
		
			/*
			 * Se obtiene la insercion de la previsualizacion.
			 */
			int top = figura.obtenerInsercionSuperior(0);
			int left = figura.obtenerInsercionEnIzquierda(0);
		
			/*
			 * Se pinta la previsualizacion
			 */
			for(int i = 0; i < dimension; i++) {
				for(int j = 0; j < dimension; j++) {
					if(figura.existeCuadro(j, i, 0)) {
						drawTile(figura, startX + ((j - left) * TAMANIO_CUADRO), startY + ((i - top) * TAMANIO_CUADRO), g);
					}
				}
			}
		}
	}
	
	/**
	 * Dibuja un cuadro en la ventana de vista previa
	 * @param figura La figura a pintar
	 * @param x La coordenada en x del cuadro
	 * @param y La coordenada en y del cuadro
	 * @param g El objeto graphics.
	 */
	private void drawTile(Figura figura, int x, int y, Graphics g) {
		/*
		 * Se llena todo el cuadro con el color
		 */
		g.setColor(figura.getColorBase());
		g.fillRect(x, y, TAMANIO_CUADRO, TAMANIO_CUADRO);
		
		/*
		 * Se llenan los bordes
		 */
		g.setColor(figura.getColorOscuro());
		g.fillRect(x, y + TAMANIO_CUADRO - SOMBRA_CUADRO, TAMANIO_CUADRO, SOMBRA_CUADRO);
		g.fillRect(x + TAMANIO_CUADRO - SOMBRA_CUADRO, y, SOMBRA_CUADRO, TAMANIO_CUADRO);
		
		/*
		 * Rellena los bordes superior e izquierdo con el sombreado claro
		 */
		g.setColor(figura.getColorClaro());
		for(int i = 0; i < SOMBRA_CUADRO; i++) {
			g.drawLine(x, y + i, x + TAMANIO_CUADRO - i - 1, y + i);
			g.drawLine(x + i, y, x + i, y + TAMANIO_CUADRO - i - 1);
		}
	}
	
}
